﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory>
using namespace std;
struct Date
{
	int _year;
	int _month;
	int _day;
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	}
	~Date()
	{
		cout << "~Date()" << endl;
	}
};

template<class T>
void DeleteArrayFunc(T* ptr)
{
	delete[] ptr;
}
//仿函数模拟智能指针删除器
template<class T>
class DeleteArray
{
	public :
	void operator()(T* ptr)
	{
		delete[] ptr;
	}
};
class Fclose
{
public:
	void operator()(FILE* ptr)
	{
		cout << "fclose:" << ptr << endl;
		fclose(ptr);
	}
};
//int main()
//{
//	// 这样实现程序会崩溃
//	unique_ptr<Date[]> up1(new Date[10]);
//	shared_ptr<Date[]> sp1(new Date[10]);
//	// 解决方案1
//	// 因为new[]经常使⽤，所以unique_ptr和shared_ptr
//	// 实现了⼀个特化版本，这个特化版本析构时⽤的delete[]
//	/*unique_ptr<Date[]> up1(new Date[5]);
//	shared_ptr<Date[]> sp1(new Date[5]);*/
//	// 解决方案2:仿函数模拟智能指针删除器
//	shared_ptr<Date>sp2(new Date[5], DeleteArray<Date[]>());
//	shared_ptr<Date> sp3(new Date[5], [](Date*ptr){delete[] ptr;});
//	unique_ptr<Date,decltype([](Date* ptr) {delete[] ptr; })> up2(new Date[5]);
//	//lambda表达式不支持默认构造所以编译报错
//
//
//	return 0;
//}
//int main()
//{
//	unique_ptr<Date[]> up1(new Date[10]);
//	shared_ptr<Date[]> sp1(new Date[10]);
//
//	// 定制删除器
//	shared_ptr<Date> sp2(new Date[10], DeleteArray<Date>());
//	shared_ptr<Date> sp3(new Date[10], [](Date* ptr) {delete[] ptr; });
//
//	unique_ptr<Date, DeleteArray<Date>> up2(new Date[5]);
//	auto del = [](Date* ptr) {delete[] ptr; };
//	unique_ptr<Date, decltype(del)> up3(new Date[5], del);
//	// C++20支持
//	unique_ptr<Date, decltype(del)> up4(new Date[5]);
//
//	shared_ptr<FILE> sp5(fopen("Test.cpp", "r"), Fclose());
//	shared_ptr<FILE> sp6(fopen("Test.cpp", "r"), [](FILE* ptr) 
//		{
//			cout << "fclose:" << ptr << endl;
//			fclose(ptr);
//		});
//
//	shared_ptr<Date> sp10(new Date(2025,10,12));
//	//shared_ptr<Date> sp11 = make_shared<Date>(2025, 10, 12);
//	auto sp11 = make_shared<Date>(2025, 10, 12);
//
//	//不支持指针隐式类型转换
//	//shared_ptr<Date> sp12 = new Date;
//	shared_ptr<Date> sp12(new Date);
//
//	return 0;
//}

//int main()
//{
//	shared_ptr<Date> sp1(new Date(2024, 9, 11));
//	shared_ptr<Date> sp2 = make_shared<Date>(2024, 9, 11);
//	auto sp3 = make_shared<Date>(2024, 9, 11);
//	shared_ptr<Date> sp4;
//	// if (sp1.operator bool())
//	if (sp1)
//		cout << "sp1 is not nullptr" << endl;
//	if (!sp4)
//		cout << "sp1 is nullptr" << endl;
//	// 报错
//	shared_ptr<Date> sp5 = new Date(2024, 9, 11);
//	unique_ptr<Date> sp6 = new Date(2024, 9, 11);
//	return 0;
//}
